// pages/playBack/playBack.js
import { URL, Toast, ajax, engine, computeScore } from '../../utils/index'
let wsEngine = engine.createWsEngine({});
var recorder = wx.getRecorderManager()
const options = {
  duration: 300000, //指定录音的时长，单位 ms
  sampleRate: 16000, //采样率
  numberOfChannels: 1, //录音通道数
  encodeBitRate: 96000, //编码码率
  format: 'mp3', //音频格式，有效值 aac/mp3
  frameSize: 50, //指定帧大小，单位 KB
}
Page({

  /**
   * 页面的初始数据
   */
  data: {
    keys: null,
    content: '学而时习之，不亦说乎？有朋自远方来，不亦乐乎？人不知而不愠，不亦君子乎？',
    file: '',
    result: null,
    status: true
  },
   //长按开始事件
  handleTouchStart: function (e) {
    console.log("开始事件: startTime = " + e.timeStamp / 1000);
  },
  //长按离开事件
  handleTouchEnd: function (e) {
    console.log("离开事件: endTime = " + e.timeStamp / 1000);
    // recorder.stop()
  },
  handleClick() {
    if (this.data.status) {
      recorder.start(options)
    } else {
      recorder.stop()
    }
    this.setData({
      status: !this.data.status
    })
    console.log('点击事件')
  },
  handleLongPress() {
    console.log('===========长按事件触发==========');
    wx.getSetting({
      success: (res) => {
        console.log(res, '-----------------------------')
        if (!res.authSetting['scope.record']) {
          //调取小程序新版授权页面
          wx.authorize({
            scope: 'scope.record',
            success: () => {
              this.wsEngineOnChange(),this.startAI()
            }, fail: () => (console.log("微信录音授权失败"), this.authorizationShowModal())
          })
        } else {
          this.wsEngineOnChange(),
          this.startAI(),
          recorder.start(options)
        }
      }
    })
  },
  // 拒绝授权或授权失败提示框
  authorizationShowModal() {
    wx.showModal({
      title: '提示',
      content: '您未授权录音，功能将无法使用',
      showCancel: true,
      confirmText: "授权",
      confirmColor: "#52a2d8",
      success: (res) => (res.confirm ? this.settdingPage() : '')
    })
  },
  // 跳转授权设置页面
  settdingPage() {
    wx.openSetting({
      success: (res) => {
        console.log(res.authSetting, '再次授权---------------');
        // 授权成功启动AI
        res.authSetting['scope.record'] ? (console.log('授权成功'), this.startAI()) : console.log('授权设置失败')
      }, fail: () => console.log("授权设置页面录音失败")
    })
  },
  // 启动AI
  startAI() {
    return new Promise((resolve, reject) => {
      wsEngine.start({
        audio: {
          duration: 60000,//传入参数手动设置录音时长
          sampleRate: 16000,
          audioType: "mp3",
          channel : 1,
          sampleBytes: 2
        },
        request: {
          coreType: "cn.pred.raw",
          refText: this.data.content,
          attachAudioUrl: 1,
          rank: 100,
        },
        app: this.data.keys,
        success: (res) => {
          this.setData({
            tokenId: res.tokenId ? res.tokenId : ''
          })
          console.log("===启动AI======success=============  " + JSON.stringify(res));
          resolve(res)
        },fail: (res) => (console.log("===启动AI======fail=============  " + JSON.stringify(res)),reject(res))
      })
    })
    
  },
  // 获取AI密钥授权
  getSign() {
    // applet/sign/getSign
    ajax.get('/applet/sign/getSign').then(res => {
      if (res.data.code === 1) {
        this.setData({
          keys: res.data.data
        })
        console.log(this.data.keys)
      } else (ajax.toast.fail('获取AI密钥失败\n请联系管理员'), console.log(res))
    }).catch(e => (ajax.toast.fail('获取AI密钥请求失败,请联系管理员'), console.log(e)))
  },
  // 发送AI录音
  sendData(frameBuffer) {
    wsEngine.feed({
      data: frameBuffer,    // frameBuffer为微信录音机回调的音频数据
      success: (res) => {
        // feed 成功
        console.log('发送AI录音函数success================',res)
      },
      fail: (res) => {
        console.log('发送AI录音函数fail===================',res)
      }
    })
  },
  // 结束AI发送录音------
  finishSendData () {
    wsEngine.stop();
  },

  // AI 事件监听函数
  wsEngineOnChange() {
    wsEngine.onResult((res) => {
      console.log("===收到评分结果=============JSON" + JSON.stringify(res));
      console.log("===收到评分结果=============" ,res);
      this.setData({
        file: 'http://'+res.audioUrl+'.mp3',
        result: res.result
      })
      console.log('返回结果:', computeScore(res.result))
    });
    wsEngine.onErrorResult((res) => {
      console.log("===收到错误结果=============" + JSON.stringify(res))
    });
  },
  // 小程序录音事件监听函数
  recorderOnChange() {
    // 监听录音开始事件
    recorder.onStart(res => {
      console.log('录音开始事件==================',res)
    })
    
    // 监听录音继续事件
    recorder.onResume(res => {
      console.log('录音继续事件==================',res)
    })
    
    // 监听录音暂停事件
    recorder.onPause(res => {
      console.log('录音暂停事件==================',res)
    })
    
    // 监听录音结束事件
    recorder.onStop(res => {
      console.log('录音结束事件==================',res)
      this.setData({
        file: res.tempFilePath,
      })
      // this.finishSendData()
    })
    
    // 监听已录制完指定帧大小的文件事件。如果设置了 frameSize，则会回调此事件。
    recorder.onFrameRecorded(res => {
      // this.sendData(res.frameBuffer)
      console.log('已录制完指==================',res)
    })
    
    // 监听录音错误事件
    recorder.onError(res => {
      console.log('监听录音错误事件==================',res)
      // file
    })
    
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {
    this.recorderOnChange(),this.getSign()
  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function () {

  }
})